# -*-coding:utf-8-*-
# Mixmin 插件方式
# 通常我们希望修改对象的行为，而不是修改类的。同样的我们可以利用__dict__来扩展对象的方法。
class PlugIn(object):
    def __init__(self):
        self._exported_methods = []

    def plugin(self, owner):
        for f in self._exported_methods:
            owner.__dict__[f.__name__] = f

    def plugout(self, owner):
        for f in self._exported_methods:
            del owner.__dict__[f.__name__]


class AFeature(PlugIn):
    def __init__(self):
        super(AFeature, self).__init__()
        self._exported_methods.append(self.get_a_value)

    def get_a_value(self):
        print
        'a future.'


class BFeature(PlugIn):
    def __init__(self):
        super(BFeature, self).__init__()
        self._exported_methods.append(self.get_b_value)

    def get_b_value(self):
        print
        'b future'


class Combine: pass


c = Combine()
AFeature().plugin(c)
BFeature().plugin(c)

print(c.get_a_value())
print(c.get_b_value())
# 注：定义一个插入的类，用来将具体的对象插入进去，从而获得该类的所有方法。比如AFuture().plugin(c),
# 就是说，AFeature里存储了一些方法，然后插入了c对象，这样c对象就获得了AFeature里所有的方法。